package controlador;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.io.File;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowAdapter;
import vista.InterfazGraficaGuardarReporte;
import vista.Mensaje;
import vista.VentanaIndependiente;
import modelo.GuardarReporte;
import modelo.GuardarReporteSwingWorker;
import modelo.DecoradorGuardarReporteCabecera;

public class ControladorGuardarReporte<T> extends WindowAdapter implements ActionListener,PropertyChangeListener 
{
    private InterfazGraficaGuardarReporte interfazGrafica;
	private GuardarReporte<T> guardarReporte;
    private GuardarReporteSwingWorker<T> guardarReporteSwingWorker;
    private File archivo;
    
    public ControladorGuardarReporte(VentanaIndependiente ventana,File archivo,List<T> lista, String titulo) throws Exception
	{
        guardarReporteSwingWorker= new GuardarReporteSwingWorker<T>();
    	guardarReporteSwingWorker.addPropertyChangeListener((PropertyChangeListener)this);
    	
    	guardarReporte= new DecoradorGuardarReporteCabecera<T>(guardarReporteSwingWorker,titulo);
    	this.archivo= archivo;
    	
	    interfazGrafica= new InterfazGraficaGuardarReporte(ventana);
	    
	    interfazGrafica.addListener((ActionListener) this);
	    interfazGrafica.addListener((WindowListener) this);
	    
	    guardarReporte.guardar(this.archivo, lista);
	    
	    interfazGrafica.visualizarVentana();
	    
	}
    
    private void cancelar()
    {
    	try
		{
		  guardarReporteSwingWorker.cancelar();
		  if (archivo.exists())
			  archivo.delete();
		  
		  interfazGrafica.descargarMemoria();
		}
		catch(Exception ex)
		{
			Mensaje.mostrarError("Error Cancelando la Generacion de Reporte!");
		}
    }
    
    public void windowClosing(WindowEvent e)
    {
    	cancelar();
    }
	
	
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		cancelar();
		
	}


	@Override
	public void propertyChange(PropertyChangeEvent evt) {
		if (evt.getPropertyName().equalsIgnoreCase("progress"))
        {
             interfazGrafica.asignarValor((Integer) evt.getNewValue());
             if ((Integer)evt.getNewValue()==100)
             {
                interfazGrafica.descargarMemoria();
             }
        }
		
	}
	

}
